/**
 *
 * @author luguoxiang
 * @Date: 2025/9/27
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */

import { Node, Task } from '@/soar/components/LgFlowChat/type';

/**
 * 查找当前 approval 节点的所有前置 approval 节点（仅沿来路，不跨分支）
 * @param currentKey 当前节点（必须是 approval）
 * @param nodes 所有节点列表
 * @returns Task[] 所有前置 approval 节点（按从近到远顺序）
 */
export function findPredecessorApprovals(currentKey: string, nodes: Node[]): Task[] {
  // eslint-disable-next-line consistent-return
  const handler = (list: Node[], tasks: Task[]): Task[] | undefined => {
    let res = [];
    for (const node of list) {
      if (node.type === 'exclusive-gateway') {
        // 搜集本分支所有 Task 节点，若没找到说明目标节点在网关后面，网关内所有节点都符合要求，若找到则只保留对应分支的节点
        const exclusiveTasks = [];
        for (const item of node.items) {
          const rs = handler(item.nodes, exclusiveTasks);
          if (rs) {
            return res.concat(rs);
          }
        }
        res = res.concat(exclusiveTasks);
      } else if (node.type === 'approval' || node.type === 'start') {
        if (node.key === currentKey) {
          return res;
        }
        res.push(node);
        tasks.push(node);
      }
    }
  };
  return handler(nodes, []) || [];
}

/**
 * 合并字段
 * @param fields - 字段定义列表，包含 key 和 name
 * @param fieldPermits - 当前字段权限列表
 */
export function mergeFieldPermit(
  fields: { key: string; name: string }[],
  fieldPermits: { key: string; name: string; permit: 0 | 1 | 2 }[],
  defPermit: 0 | 1 | 2,
): { key: string; name: string; permit: 0 | 1 | 2 }[] {
  // 构建 fieldPermits 的 key 到项的映射，便于查找
  const permitMap = new Map<string, { key: string; name: string; permit: 0 | 1 | 2 }>();
  for (const item of fieldPermits) {
    permitMap.set(item.key, item);
  }

  // 按 fields 的顺序构建结果
  const result: { key: string; name: string; permit: 0 | 1 | 2 }[] = [];

  for (const field of fields) {
    const existing = permitMap.get(field.key);
    if (existing != null) {
      // 存在：保留 permit，更新 name
      result.push({
        key: field.key,
        name: field.name, // 使用 fields 中的 name
        permit: existing.permit,
      });
    } else {
      // 不存在：新增，默认 permit 为 0
      result.push({
        key: field.key,
        name: field.name,
        permit: defPermit,
      });
    }
  }

  return result;
}

/**
 * 合并按钮
 * @param buttons - 字段定义列表，包含 key 和 name
 * @param buttonPermits - 当前字段权限列表
 */
export function mergeButtonPermit(
  buttons: { key: string; name: string }[],
  buttonPermits: { key: string; name: string; visible: boolean }[],
): { key: string; name: string; visible: boolean }[] {
  // 构建 fieldPermits 的 key 到项的映射，便于查找
  const visibleMap = new Map<string, { key: string; name: string; visible: boolean }>();
  for (const item of buttonPermits) {
    visibleMap.set(item.key, item);
  }

  // 按 fields 的顺序构建结果
  const result: { key: string; name: string; visible: boolean }[] = [];

  for (const field of buttons) {
    const existing = visibleMap.get(field.key);
    if (existing != null) {
      // 存在：保留 permit，更新 name
      result.push({
        key: field.key,
        name: field.name, // 使用 fields 中的 name
        visible: existing.visible,
      });
    } else {
      // 不存在：新增，默认 permit 为 0
      result.push({
        key: field.key,
        name: field.name,
        visible: false,
      });
    }
  }

  return result;
}
